/* 
 * ボス破壊
 */
#include <system.h>
#include <nt.h>
#include <farl.h>
#include <agl.h>
#include <vpsg.h>
#include <libm.h>
#include "spec.h"
#include "vardecl.h"
#include "adpcm.h"
#include "psgdef.h"

/* 
========================================
  ボス破壊演出
========================================
*/
void
BossBang()
{
  register machine *mp;
  register object *gp;
  int i;
  struct CELPRM cellophane;

  /* セロファンパラメータ設定 */
  cellophane.fixc   = YUV_WHITE;    /* セロファンに使用する色 */
  cellophane.celcr  = 0xc000;       /* フロントセロファンイネーブル */
  cellophane.celsp  = 0x0000;       /* スプライトセロファン個別設定なし */
  cellophane.cel1A  = 0x0000;       /* セロファン係数Ａ初期値 （セロファン面）*/
  cellophane.cel1B  = 0x0888;       /* セロファン係数Ｂ初期値 （表示面）*/
  set_nt_cel(&cellophane);
  /* カメラ設定 */
  AGLResetCamera();
  AGLTranslateCamera(0, -0x100, 0x06);
  AGLRotateCameraX(CAM_ANGLE);
  AGLPerspectiveCamera(0xffc0 * SCALE_PERS);
  AGLZoomCamera(CAM_ZOOM, CAM_ZOOM, 0x20);

  for (i = 0; i < 20; i++) {
    VSyncWait();

    /* ボス本体のマトリクス計算 */
    mp = &Machine[PLAYER2];
    AGLResetObj(&mp->type->obj); /* オブジェクトマトリクス初期化 */
    FarlSetDefColorReg(0x0801);        /* デフォルトカラー設定 */
    
    /* スケール決定 */
    AGLScaleObj(&mp->type->obj, SCALE_CAR + i * 20, SCALE_CAR + i * 20, SCALE_CAR + i * 20);
    /* 向き決定 */
    AGLRotateObjX(&mp->type->obj, 900);
    AGLRotateObjZ(&mp->type->obj, mp->direct);
    /* 位置決定 */
    AGLTranslateObj(&mp->type->obj,
                    FarlFix187(Locate[PLAYER2][LX]),
                    FarlFix187(Locate[PLAYER2][LY]),
                    FarlFix187(Locate[PLAYER2][LZ]));
    /* 描画 */
    AGLFixPutObj(&mp->type->obj);

    /* 地面描画 */    
    DrawGround();
    /* 表示処理が終わるまで待つ */
    ASLSync();
    AGLShot();
    MSLSync();

    /* ＰＣＭの再生 */
    AdpcmVolume(CHANNEL_1, MAX_PCM_VOLUME, MAX_PCM_VOLUME);
    AdpcmPlay(CHANNEL_1, &pInfo[P_MONSTER]);
    /* ホワイトアウト処理 */
    if (i >= 11) {
      cellophane.cel1A += 0x111;
      cellophane.cel1B -= 0x111;
      set_nt_cel(&cellophane);
    }
  }
  /* 画面を真っ白に設定 */
  cellophane.cel1A = 0x888;
  cellophane.cel1B = 0x000;
  set_nt_cel(&cellophane);
  /* 画面を見えなくしてから背景を白くうめ尽くす */
  KINGScreen(1);
  KINGBoxFill(0, 0, 256, 256, 0xff88);
  /* 念の為に表示処理が終わるまで待つ */
  ASLSync();
  AGLShot();
  MSLSync();
  /* GOOD JOB 表示 */
  GoodJob();
  /* すこし待つ */
  for (i = 0; i < 100; i++) {
    VSyncWait();
  }
  /* エンディング曲の演奏 */
  PSGPlay(MU_ENDING);
  /* 白い画面から徐々に GOOD JOB が出てくる処理 */
  for (i = 0; i < 8; i++) {
    cellophane.cel1A -= 0x111;
    cellophane.cel1B += 0x111;
    set_nt_cel(&cellophane);
    /* 浮き上がるタイミング */
    VSyncWait();
    VSyncWait();
    VSyncWait();
    VSyncWait();
    VSyncWait();
    VSyncWait();
  }
  /* 普通の画面に戻す */
  cellophane.cel1A = 0x000;
  cellophane.cel1B = 0x888;
  set_nt_cel(&cellophane);
  /* ＰＣＭの音量を下げる */
  AdpcmVolume(CHANNEL_1, MIN_PCM_VOLUME, MIN_PCM_VOLUME);
  AdpcmVolume(CHANNEL_2, MIN_PCM_VOLUME, MIN_PCM_VOLUME);
  /* 音楽が鳴り終わるまで待つ */
  while (psg_musicch() & CH3);
  /* さらに約0.5秒待つ */
  for (i = 0; i < 30; i++) {
    VSyncWait();
  }
}
